home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / LGP250S1.ZIP / src / libgplus.5 / libgplus / tests / tinteger.cc < prev    next >
C/C++ Source or Header  |  1993-08-27  |  11KB  |  437 lines

  1. /*
  2.  a test file for Integer class
  3.  */
  4.  
  5. #include <Integer.h>
  6. #include <assert.h>
  7.  
  8. #define tassert(ex) { cerr << #ex; \
  9.                        if ((ex)) cerr << " OK\n"; \
  10.                        else cerr << " Fail\n"; }
  11.  
  12.  
  13. Integer factorial(Integer n)
  14. {
  15.   Integer f;
  16.   if (n < 0)
  17.     f = 0;
  18.   else
  19.   {
  20.     f = 1;
  21.     while (n > 0)
  22.     {
  23.       f *= n;
  24.       --n;
  25.     }
  26.   }
  27.   return f;
  28. }
  29.  
  30. Integer fibonacci(long n)
  31. {
  32.   Integer f;
  33.   if (n <= 0)
  34.     f = 0;
  35.   else
  36.   {
  37.     f = 1;
  38.     Integer prev = 0;
  39.     Integer tmp;
  40.     while (n > 1)
  41.     {
  42.       tmp = f;
  43.       f += prev;
  44.       prev = tmp;
  45.       --n;
  46.     }
  47.   }
  48.   return f;
  49. }
  50.  
  51.  
  52. void identitytest(Integer& a, Integer& b, Integer& c)
  53. {
  54.   assert( -(-a) ==  a);
  55.   assert( (a + b) ==  (b + a));
  56.   assert( (a + (-b)) ==  (a - b));
  57.   assert( (a * b) ==  (b * a));
  58.   assert( (a * (-b)) ==  -(a * b));
  59.   assert( (a / (-b)) ==  -(a / b));
  60.   assert( (a - b) ==  -(b - a));
  61.   assert( (a + (b + c)) ==  ((a + b) + c));
  62.   assert( (a * (b * c)) ==  ((a * b) * c));
  63.   assert( (a * (b + c)) ==  ((a * b) + (a * c)));
  64.   assert( ((a - b) + b) ==  a);
  65.   assert( ((a + b) - b) ==  a);
  66.   assert( ((a * b) / b) ==  a);
  67.   assert( ((a * b) % b) ==  0);
  68.   assert( (b * (a / b) + (a % b)) ==  a);
  69.   assert( ((a + b) % c) ==  ((a % c) + (b % c)) % c);
  70. }
  71.  
  72. void utiltest(Integer& a)
  73. {
  74.   assert(sqrt(sqr(a)) == a);
  75.   assert(sqr(sqrt(a)) <= a);
  76.  
  77.   Integer x = 1;
  78.   for (int i = 0; i < 10; ++i)
  79.   {
  80.     assert(pow(a, i) == x);
  81.     x *= a;
  82.   }
  83.   setbit(x, 0);
  84.   assert(testbit(x, 0));
  85.   assert(odd(x));
  86.   assert(!even(x));
  87.   clearbit(x, 0);
  88.   clearbit(x, 1);
  89.   assert(even(x));
  90.   assert(!odd(x));
  91.   assert(x % 4 == 0);
  92.  
  93. }
  94.  
  95. void bittest(Integer& a, Integer& b, Integer& c)
  96. {
  97.   assert( (a | b) ==  (b | a));
  98.   assert( (a & b) ==  (b & a));
  99.   assert( (a ^ b) ==  (b ^ a));
  100.   assert( (a | (b | c)) ==  ((a | b) | c));
  101.   assert( (a & (b & c)) ==  ((a & b) & c));
  102.   assert( (a & (b | c)) ==  ((a & b) | (a & c)));
  103.   assert( (a | (b & c)) ==  ((a | b) & (a | c)));
  104.   assert( (a & (a | b)) ==  a);
  105.   assert( (a | (a & b)) ==  a);
  106. }
  107.  
  108. void accumtest(Integer& a, Integer& b, Integer& c)
  109. {
  110.   Integer x = a;
  111.   x *= b;
  112.   assert(x == (a * b));
  113.   x += c;
  114.   assert(x == ((a * b) + c));
  115.   x -= a;
  116.   assert(x == (((a * b) + c) - a));
  117.   x /= b;
  118.   assert(x == ((((a * b) + c) - a) / b));
  119.   x %= c;
  120.   assert(x == (((((a * b) + c) - a) / b) % c));
  121.   x &= a;
  122.   assert(x == ((((((a * b) + c) - a) / b) % c) & a));
  123.   x |= b;
  124.   assert(x == (((((((a * b) + c) - a) / b) % c) & a) | b));
  125.   x ^= c;
  126.   assert(x == ((((((((a * b) + c) - a) / b) % c) & a) | b) ^ c));
  127.  
  128.   assert(x.OK());
  129. }
  130.  
  131. void longidentitytest(Integer& a, long b, long c)
  132. {
  133.   assert( (a + b) ==  (b + a));
  134.   assert( (a + (-b)) ==  (a - b));
  135.   assert( (a * b) ==  (b * a));
  136.   assert( (a * (-b)) ==  -(a * b));
  137.   assert( (a / (-b)) ==  -(a / b));
  138.   assert( (a - b) ==  -(b - a));
  139.   assert( (a + (b + c)) ==  ((a + b) + c));
  140.   assert( (a * (b * c)) ==  ((a * b) * c));
  141.   assert( (a * (b + c)) ==  ((a * b) + (a * c)));
  142.   assert( ((a - b) + b) ==  a);
  143.   assert( ((a + b) - b) ==  a);
  144.   assert( ((a * b) / b) ==  a);
  145.   assert( ((a * b) % b) ==  0);
  146.   assert( (b * (a / b) + (a % b)) ==  a);
  147.   assert( ((a + b) % c) ==  ((a % c) + (b % c)) % c);
  148. }
  149.  
  150. void longbittest(Integer& a, long b, long c)
  151. {
  152.   assert( (a | b) ==  (b | a));
  153.   assert( (a & b) ==  (b & a));
  154.   assert( (a ^ b) ==  (b ^ a));
  155.   assert( (a | (b | c)) ==  ((a | b) | c));
  156.   assert( (a & (b & c)) ==  ((a & b) & c));
  157.   assert( (a & (b | c)) ==  ((a & b) | (a & c)));
  158.   assert( (a | (b & c)) ==  ((a | b) & (a | c)));
  159.   assert( (a & (a | b)) ==  a);
  160.   assert( (a | (a & b)) ==  a);
  161. }
  162.  
  163. void longaccumtest(Integer& a, long b, long c)
  164. {
  165.   Integer x = a;
  166.   x *= b;
  167.   assert(x == (a * b));
  168.   x += c;
  169.   assert(x == ((a * b) + c));
  170.   x -= a;
  171.   assert(x == (((a * b) + c) - a));
  172.   x /= b;
  173.   assert(x == ((((a * b) + c) - a) / b));
  174.   x %= c;
  175.   assert(x == (((((a * b) + c) - a) / b) % c));
  176.   x &= a;
  177.   assert(x == ((((((a * b) + c) - a) / b) % c) & a));
  178.   x |= b;
  179.   assert(x == (((((((a * b) + c) - a) / b) % c) & a) | b));
  180.   x ^= c;
  181.   assert(x == ((((((((a * b) + c) - a) / b) % c) & a) | b) ^ c));
  182.  
  183.   assert(x.OK());
  184. }
  185.  
  186. void anothertest()
  187. {
  188.   Integer pow64 = Ipow(2, 64);
  189.   cout << "pow64 = Ipow(2, 64) = " << pow64 << "\n";
  190.   assert(pow64.OK());
  191.   cout << "lg(pow64) = " << lg(pow64) << "\n";
  192.   assert(lg(pow64) == 64);
  193.   for (int k = 0; k < 64; ++k) assert(testbit(pow64, k) == 0);
  194.   assert(testbit(pow64, k) != 0);
  195.  
  196.   Integer s64 = 1;
  197.   s64 <<= 64;
  198.   cout << "s64 = 1 << 64 = " << s64 << "\n";
  199.   assert(s64.OK());
  200.  
  201.   assert(s64 == pow64);
  202.   assert(s64 >= pow64);
  203.   assert(s64 <= pow64);
  204.   assert(!(s64 != pow64));
  205.   assert(!(s64 > pow64));
  206.   assert(!(s64 < pow64));
  207.  
  208.   Integer s32 = s64 >> 32;
  209.   cout << "s32 = s64 >> 32 = " << s32 << "\n";
  210.   assert(s32.OK());
  211.   assert(lg(s32) == 32);
  212.   assert(!(pow64 == s32));
  213.   assert(!(pow64 < s32));
  214.   assert(!(pow64 <= s32));
  215.   assert(pow64 != s32);
  216.   assert(pow64 >= s32);
  217.   assert(pow64 > s32);
  218.  
  219.   Integer comps64 = ~s64;
  220.   cout << "comps64 = ~s64 = " << comps64 << "\n";
  221.   for (k = 0; k < 64; ++k) assert(testbit(comps64, k) == !testbit(s64, k));
  222.   Integer result = (comps64 & s32);
  223.   cout << "comps64 & s32 = " << result << "\n";
  224.   assert(result.OK());
  225.   result = (comps64 | s32);
  226.   cout << "comps64 | s32 = " << result << "\n";
  227.   assert(result.OK());
  228.   result = (comps64 ^ s32);
  229.   cout << "comps64 ^ s32 = " << result << "\n";
  230.   assert(result.OK());
  231.  
  232.   identitytest(s64, s32, comps64);
  233.   bittest(s32, s64, comps64);
  234.   accumtest(comps64, s32, pow64);
  235.   utiltest(s32);
  236.   longidentitytest(s64, 1000, 50);
  237.   longbittest(s64, 12345, 67890);
  238.   longaccumtest(s32, 100000, 1);
  239.  
  240. }
  241.  
  242. void iotest()
  243. {
  244.   Integer result;
  245.  
  246.   cout << "\nenter an Integer: ";
  247.   cin.setf(0, ios::basefield);
  248.   cin >> result;
  249.   cout << "number = " << hex << result << dec << "\n";
  250.   assert(result.OK());
  251.  
  252.   cout << "enter another Integer: ";
  253.   cin >> result;
  254.   cout << "number = " << result << "\n";
  255.   assert(result.OK());
  256.  
  257.   cout << "enter another Integer: ";
  258.   cin >> dec >> result;
  259.   cout << "number = " << result << "\n";
  260.   assert(result.OK());
  261.  
  262. }
  263.  
  264. void fibtest()
  265. {
  266.   Integer fib50 = fibonacci(50);
  267.   cout << "fib50 = fibonacci(50) = " << fib50 << "\n";
  268.   assert(fib50.OK());
  269.   Integer fib48 = fibonacci(48);
  270.   cout << "fib48 = fibonacci(48) = " << fib48 << "\n";
  271.   assert(fib48.OK());
  272.  
  273.   Integer result = fib48 + fib50;
  274.   cout << "fib48 + fib50 = " << result << "\n";
  275.   result = fib48 - fib50;
  276.   cout << "fib48 - fib50 = " << result << "\n";
  277.   result = fib48 * fib50;
  278.   cout << "fib48 * fib50 = " << result << "\n";
  279.   result = fib48 / fib50;
  280.   cout << "fib48 / fib50 = " << result << "\n";
  281.   result = fib48 % fib50;
  282.   cout << "fib48 % fib50 = " << result << "\n";
  283.   result = gcd(fib50, fib48);
  284.   cout << "gcd(fib50, fib48) = " << result << "\n";
  285.   result = sqrt(fib50);
  286.   cout << "sqrt(fib50) = " << result << "\n";
  287.  
  288.   identitytest(result, fib50, fib48);
  289.   bittest(result, fib50, fib48);
  290.   accumtest(result, fib50, fib48);
  291.   utiltest(fib48);
  292.   longidentitytest(fib50, 1000, 50);
  293.   longaccumtest(fib48, 100000, 1);
  294. }
  295.  
  296.  
  297. void facttest(Integer& one, Integer& two)
  298. {
  299.   Integer fact30(factorial(30));
  300.   cout << "fact30 = factorial(30) = " << fact30 << "\n";
  301.   assert(fact30.OK());
  302.  
  303.   Integer fact28(factorial(28));
  304.   cout << "fact28 = factorial(28) = " << fact28 << "\n";
  305.   assert(fact28.OK());
  306.   assert(fact30 == fact28 * 870);
  307.  
  308.   Integer result = fact30 + fact28;
  309.   cout << "fact30 + fact28 = " <<  result << "\n";
  310.   result = fact30 - fact28;
  311.   cout << "fact30 - fact28 = " << result << "\n";
  312.   result = fact30 * fact28;
  313.   cout << "fact30 * fact28 = " << result << "\n";
  314.   result = fact30 / fact28;
  315.   cout << "fact30 / fact28 = " << result << "\n";
  316.   result = fact30 % fact28;
  317.   cout << "fact30 % fact28 = " << result << "\n";
  318.  
  319.   result = -fact30;
  320.   cout << "-fact30 = " << result << "\n";
  321.   assert(abs(result) == fact30);
  322.  
  323.   cout << "lg(fact30) = " << lg(fact30) << "\n";
  324.   assert(lg(fact30) == 107);
  325.  
  326.   result = gcd(fact30, fact28);
  327.   cout << "gcd(fact30, fact28) = " << result << "\n";
  328.   assert(result == fact28);
  329.  
  330.   result = sqrt(fact30);
  331.   cout << "sqrt(fact30) = " << result << "\n";
  332.  
  333.   Integer negfact31 = fact30 * -31;
  334.   Integer posfact31 = abs(negfact31);
  335.   assert(negfact31.OK());
  336.   assert(posfact31.OK());
  337.   cout << "negfact31 = " << negfact31 << "\n";
  338.   result = fact30 + negfact31;
  339.   cout << "fact30 + negfact31 = " << result << "\n";
  340.   result = fact30 - negfact31;
  341.   cout << "fact30 - negfact31 = " << result << "\n";
  342.   result = fact30 * negfact31;
  343.   cout << "fact30 * negfact31 = " << result << "\n";
  344.   result = fact30 / negfact31;
  345.   cout << "fact30 / negfact31 = " << result << "\n";
  346.   result = fact30 % negfact31;
  347.   cout << "fact30 % negfact31 = " << result << "\n";
  348.   result = gcd(fact30, negfact31);
  349.   cout << "gcd(fact30, negfact31) = " << result << "\n";
  350.   assert(result == fact30);
  351.  
  352.   identitytest(one, one, one);
  353.   identitytest(one, one, one);
  354.   identitytest(one, two, fact30);
  355.   identitytest(fact30, posfact31, fact28);
  356.   identitytest(fact30, negfact31, fact28);
  357.   identitytest(negfact31, posfact31, fact28);
  358.  
  359.   bittest(one, one, one);
  360.   bittest(one, one, one);
  361.   bittest(one, two, fact30);
  362.   bittest(fact30, posfact31, fact28);
  363.  
  364.   accumtest(one, one, one);
  365.   accumtest(one, one, one);
  366.   accumtest(one, two, fact30);
  367.   accumtest(fact30, posfact31, fact28);
  368.  
  369.   utiltest(one);
  370.   utiltest(fact30);
  371.   utiltest(posfact31);
  372.  
  373.   longidentitytest(one, 1, 1);
  374.   longidentitytest(one, 2, 3);
  375.   longidentitytest(fact30, 3, -20);
  376.   longidentitytest(fact30, 4, 20000);
  377.   longidentitytest(negfact31, -100, 20000);
  378.  
  379.   longbittest(one, 1, 1);
  380.   longbittest(one, 2, 3);
  381.   longbittest(fact30, 4, 20000);
  382.   longbittest(fact28, 1000, 50);
  383.  
  384.   longaccumtest(one, 1, 1);
  385.   longaccumtest(one, 2, 3);
  386.   longaccumtest(fact30, 4, 20000);
  387.   longaccumtest(fact30, 1000, 50);
  388.   longaccumtest(fact28, 10000000, 100000000);
  389. }
  390.  
  391. void modtest()
  392. {
  393.   Integer b, e, m;
  394.  
  395.   m = 1; m <<= 32;
  396.   b = m + 1;
  397.  
  398.   e = Ipow( 2, 32 );
  399.   b = Ipow( 2, 32 );                  // use b as a comparison
  400.   cout << "2^32 = " << e << "\n";
  401.  
  402.   e %= (e-1);                         // do same op two ways...
  403.   b = b % (b - 1);
  404.  
  405.   cout << "2^32 % (2^32-1) = " << e << "\n"; // e is incorrect here
  406.   cout << "2^32 % (2^32-1) = " << b << "\n"; // but b is ok
  407. }
  408.  
  409. int main()
  410. {
  411.   Integer one = 1;
  412.   cout << "one = " << one << "\n";
  413.   assert(one.OK());
  414.   assert(one == 1);
  415.   cout << "one + 1 = " << (one + 1) << "\n";
  416.  
  417.   Integer two = 2;
  418.   cout << "two = " << two << "\n";
  419.   assert(two.OK());
  420.   assert(two == 2);
  421.  
  422. /* inbox/1782 */
  423.   Integer n (0);
  424.   setbit (n, 8);
  425.   clearbit (n, 16);
  426.   cout << "twofiftysix = " << n << '\n';
  427.  
  428.   facttest(one, two);
  429.   fibtest();
  430.   anothertest();
  431.   iotest();
  432.   modtest();
  433.  
  434.   cout << "\nEnd of test\n";
  435.   return 0;
  436. }
  437.